Обновил статью 12.10.2009
Bind – давно идёт считается штатным DNS-сервером в любой *nix системе. Кстати, помимо bind существует много других серверов, таких как NDS, Unbound, PowerDNS, и много других. У каждого свои преимущества и недостатки.
Идём в папку с портами и ставим bind последней версии (на момент написания статьи была версия 9.5) (Когда вылезет окошко, обязательно выбираем опцию Replace base BIND with this version)
#cd /usr/ports/dns/bind95
#make install clean
Далее переходим в каталог /etc/named для настройки сервера. Вот минимальные настройки для работоспособности сервера.
options {
// Relative to the chroot directory, if any
directory "/etc/namedb";
pid-file "/var/run/named/pid";
dump-file "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";
listen-on { 127.0.0.1; 10.0.52.254; }; // - здесь указываем интерфейсы, которые слушает DNS сервер (собственно, только эти адреса можно указывать в качестве DNS серверов на клиентах)
};
zone "." { type hint; file "named.root"; };
zone "lan" {
type master;
file "master/lan.rev";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};
Теперь нужно создать localhost.rev. В папке /etc/named должны быть 2 файла:PROTO.localhost.rev и make-localhost. Если у вас их нет, то можете взять их отсюда (ниже приведён листинг этих файлов)
#cat PROTO.localhost.rev
; From: @(#)localhost.rev 5.1 (Berkeley) 6/30/90
; $FreeBSD: src/etc/namedb/PROTO.localhost.rev,v 1.6 2000/01/10 15:31:40 peter Exp $
;
; This file is automatically edited by the `make-localhost' script in
; the /etc/namedb directory.
;
$TTL 3600
@ IN SOA @host@. root.@host@. (
@date@ ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS @host@.
1 IN PTR localhost.@domain@.
========================================
$cat make-localhost
#!/bin/sh
#
# $FreeBSD: src/etc/namedb/make-localhost,v 1.6.8.1 2004/09/30 23:36:07 dougb Exp $
#
# make-localhost - edit the appropriate local information into
# /etc/namedb/localhost.rev
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
export PATH
if [ "`hostname -s`" != "`hostname`" ]; then
# hostname must contain domain
host=`hostname -s`
fullhost=`hostname`
domain=`echo $fullhost | sed "s/^$host\.//"`
else
host=`hostname`
if [ -z "$1" ]; then
echo -n 'Enter your domain name: '
read domain
else
domain="$1"
fi
# strip trailing dot, if any
domain=`echo $domain | sed 's/\.$//'`
fullhost="$host.$domain"
fi
date=`date +"%Y%m%d"`
mkdir -p master
mv -f master/localhost.rev master/localhost.rev.BAK 2>/dev/null
exec sed -e "s/@host@/$fullhost/g" \
-e "s/@domain@/$domain/g" \
-e "s/@date@/$date/g" \
< PROTO.localhost.rev > master/localhost.rev
Теперь нужно сгенерировать localhost.rev с помощью этих 2 файлов.
#sh make-localhost
Собственно теперь в папке master появился файл localhost.rev. Если это не так – смотрите логи.
Теперь опишем зону lan.
$cat /etc/namedb/master/lan.rev
$ORIGIN lan.
$TTL 86400
@ IN SOA ns.domain.ua. hostmaster.domain.ua. (
2006060537 ; Serial
86400 ; Refresh
7200 ; Retry
604800 ; Expire
86400 ) ; Default Minimum TTL
IN NS domain.ua.
ns1 IN A 15.15.15.15
my IN A 13.13.13.13
*.my IN A 13.13.13.13
* IN A 14.14.14.14
А теперь расскажу, что здесь описано. При запросе через nslookup для имени blabla.lan – будет возвращаться 14.14.14.14, при запросе blabla.my.lan будет возвращаться 13.13.13.13, при запросеns1.lan будет – 15.15.15.15
Переходим к настройке запуска сервера. Добавляем такие строчки в /etc/rc.conf
named_enable="YES"
named_flags="-u bind"
что бы сервис запускался при запуске ОС. Запускаем сервис
#/etc/rc.d/named start
Теперь настало время проверить собственно работу нашего DNS сервера. Для этого добавим в файл /etc/resolv.conf первой строчкой такую:
nameserver 127.0.0.1
Теперь выполним nslookup для резолва имён:
$ nslookup meta.ua
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: meta.ua
Address: 194.0.131.18
Если у вас такое, значит сервер работает. Так же проверим второй адрес (10.0.0.52.254 который мы вносили в файл /etc/named/named.conf) который мы будем прописывать клиентам в качествеDNS сервера:
$ nslookup ukr.net 10.0.52.254
Server: 10.0.52.254
Address: 10.0.52.254#53
Non-authoritative answer:
Name: ukr.net
Address: 195.214.195.105
Видим, что всё работает.
Для внесения изменений в конфиги требуется их перечитка. Перечитать конфиги можно командной
#/etc/rc.d/named reload
Всё работает. Теперь можно немного добавить функциональности, а именно смотреть содержимое кеша, очищать его, да и много другого, что представляется через rndc. Что бы добавить возможность управлять DNS-сервером немного подправим конфиги. И так, после установки bind’a у нас в каталоге есть ещё один файл, а именно rndc.conf.sample, который копируем в rndc.conf и начинаем править. Приводим его к такому виду:
key "rndc-key" {
algorithm hmac-md5;
secret "ejjddRFsdkljrRdlj45jdDFdfkUJJGJddOOJGdd";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
Сам ключ secret у вас будет другим. Теперь добавляем такое в named.conf:
key "rndc-key" {
algorithm hmac-md5;
secret "ejjddRFsdkljrRdlj45jdDFdfkUJJGJddOOJGdd";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
Теперь перечитываем конфиги и смотрим sockstat: у нас должен слушаться ещё порт 953. Если всё хорошо, значит всё правильно сделали. Если нет – смотрите логи.
Я заметил, что при устновке версий 9.5 и выше у меня в логах появляется такая строка:
working directory is not writeable
Это побеждается легко. Открываем файл /etc/mtree/BIND.chroot.dist и находим и приводим его к такому виду:
/set type=dir uname=root gname=wheel mode=0755
.
dev mode=0555
..
etc
namedb uname=bind
dynamic uname=bind
..
master uname=bind
..
slave uname=bind
..
..
..
/set type=dir uname=bind gname=wheel mode=0755
var uname=root
dump
..
log
..
run
named
..
..
stats
..
..
..
то есть, добавили uname=bind где этого не хватает. Собственно, для чего это нужно. Поскольку у меня bind запускается от имени юзера bind, а согласно этому файлу (до внесения изменений) права принудительно выставляли владельцем юзера root, поэтому юзер bind имел толькоReadOnly права. После изменений нужно перезапустить named.
Иногда бывает полезным очистить кэш DNS. Например, вы зарегистрировали новый адрес, а изменения ещё не пришли в силу. Для этого можно воспользоваться командой
#rndc flush internal
(если вы используете версию 9.2.0 или выше)
#rndc stop && rndc start
(если версия 9.0 и выше)
#ndc stop && sleep 30 && ndc start
(если у вас версия 8 )
# cat /dev/null > /var/named/etc/namedb/named.run && /etc/rc.d/named restart
(грубый сброс)
Примечание1
Очень полезный обзор, почему нельзя делать CNAME на корень доменной зоны
Примечание2
Если у вас проблемы с DNS сервером, рекомендую ознакомиться